# namedtuple是一个函数，它用来创建一个自定义的tuple对象，并且规定了tuple元素的个数，并可以用属性而不是索引来引用tuple的某个元素
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x,p.y)
print(isinstance(p,tuple))


# deque是为了高效实现插入和删除操作的双向列表，适合用于队列和栈
# 使用list存储数据时，按索引访问元素很快，但是插入和删除元素就很慢了，因为list是线性存储，数据量大的时候，插入和删除效率很低
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)


# 使用dict时，如果引用的Key不存在，就会抛出KeyError。如果希望key不存在时，返回一个默认值，就可以用
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
print(dd['aa'])

# 如果要保持Key的顺序，可以用OrderedDict：
# 使用dict时，Key是无序的。在对dict做迭代时，我们无法确定Key的顺序
# OrderedDict的Key会按照插入的顺序排列，不是Key本身排序
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)


# ChainMap可以把一组dict串起来并组成一个逻辑上的dict。ChainMap本身也是一个dict，但是查找的时候，会按照顺序在内部的dict依次查找
from collections import ChainMap,defaultdict
d1 = {
    "color": 'red',
    "age": 18
}
d2 = {
    'height': 1.88,
    "color": "blue"
}
defaultDic = {
    "color": 'default_color',
    "name": 'zhangsan',
    "age": "default_age",
    "height": 'default_height'
}
c1 = ChainMap(d1,d2,defaultDic)
print(c1['color'])
print(c1['age'])
print(c1['height'])
print(c1['name'])


# Counter是一个简单的计数器，例如，统计字符出现的个数：
from collections import Counter
c = Counter('programming')
print(c)